package com.dingding.service.user.core.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.dingding.common.core.base.dao.impl.BaseDaoImpl;
import com.dingding.common.core.base.dto.DubboInvokResponseDTO;
import com.dingding.common.core.beans.UserLogin;
import com.dingding.common.core.util.ToolUtil;
import com.dingding.service.user.core.dao.IUserLoginDao;
import com.dingding.service.user.core.sql.UserLoginSQL;

/**
 * 
 * @ClassName: UserLoginDaoImpl 
 * @Description: 用户登录DAO
 * @author CHEHAUNBO 
 * @date 2016年2月19日 下午8:21:013
 * 
 */
@Component("userLoginDao")
public class UserLoginDaoImpl extends BaseDaoImpl<UserLogin> implements IUserLoginDao {

	private static final Logger log = Logger.getLogger(UserLoginDaoImpl.class);

	/**
	 * 
	 * @Title: byWeChatIdIsExistUser 
	 * @Description: 通过微信ID判断当前用户是否已经和手机号绑定
	 * @param   weChatId 用户微信ID
	 * @return boolean true 存在 false 失败
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public boolean isExistUserByWeChatId(String weChatId) {

		UserLogin userLogin = getUserLoginByProperty("weChatId", weChatId);

		if (userLogin != null) {
			return true;
		}

		return false;

	}

	/**
	 * 
	 * @Title: isExistUserByUserTelPhone 
	 * @param telPhone 通过手机号判断用户是否存在
	 * @return boolean true 成功 false 失败
	 * @author CHEHAUNBO
	 * @since V2.3.2
	 * 
	 */
	@Override
	public boolean isExistUserByUserTelPhone(String telPhone) {

		try {
			UserLogin userLogin = getUserLoginByProperty("userName", telPhone);
			if (userLogin != null) {
				return true;
			}
		} catch (Exception e) {
			log.error("根据手机号获取用户登录信息出现异常！", e);
		}

		return false;

	}

	/**
	 * 
	 * @Title: getUserLoginByProperty 
	 * @Description: 根据某一属性查询用户登录表相关信息
	 * @param property 根据某一属性查询用户
	 * @param value 属性值
	 * @return  UserLogin 查询到的用户登录信息
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public UserLogin getUserLoginByProperty(String property, String value) {

		Criterion criterion = Restrictions.eq(property, value);
		UserLogin userLogin = null;
		try {
			userLogin = super.queryCriteriaUnResult(criterion);
		} catch (Exception e) {
			log.error("根据用户属性获取用户登录信息出现异常！", e);
		}
		return userLogin;
	}

	/**
	 * 
	 * @Title: addUser 
	 * @Description: 添加用户
	 * @param tellPhone 手机号
	 * @param userLoginId 用户登录ID
	 * @return boolean true 成功 false 失败
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	public boolean addUserLogin(String tellPhone, String userLoginId, String weChatId) {

		UserLogin userlogin = new UserLogin();
		// 为用户登录表设置主键
		userlogin.setUid(userLoginId);
		// 用户登录手机号
		userlogin.setUserName(tellPhone);
		// 登录状态
		userlogin.setUserStatus(2);
		// 用户角色1：车主 2：乘客
		userlogin.setUserRole(2);
		// 是否设置过提现密码
		userlogin.setIsDeposit(1);
		// 是否内部员工 1:不是 2：是
		userlogin.setIsEmployee(1);
		// 注册时间
		userlogin.setCreateTime(new Date());
		// 下单数默认为0
		userlogin.setPublishNumber(0);
		// 取消订单数默认为0
		userlogin.setCancelNumber(0);
		// 提现次数
		userlogin.setDepositNumber(0);
		// 微信ID
		userlogin.setWeChatId(weChatId);
		// 是否参加活动
		userlogin.setIsAttendActivity(2);

		try {
			// 向用户登录表插入一条记录
			super.save(userlogin);
			return true;
		} catch (Exception e) {
			log.error("添加用户出现异常！", e);
		}

		return false;
	}
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public UserLogin addUserlogin(String tellPhone, String userLoginId, String weChatId) {
		
		UserLogin userlogin = new UserLogin();
		// 为用户登录表设置主键
		userlogin.setUid(userLoginId);
		// 用户登录手机号
		userlogin.setUserName(tellPhone);
		// 登录状态
		userlogin.setUserStatus(2);
		// 用户角色1：车主 2：乘客
		userlogin.setUserRole(2);
		// 是否设置过提现密码
		userlogin.setIsDeposit(1);
		// 是否内部员工 1:不是 2：是
		userlogin.setIsEmployee(1);
		// 注册时间
		userlogin.setCreateTime(new Date());
		// 下单数默认为0
		userlogin.setPublishNumber(0);
		// 取消订单数默认为0
		userlogin.setCancelNumber(0);
		// 提现次数
		userlogin.setDepositNumber(0);
		// 微信ID
		userlogin.setWeChatId(weChatId);
		// 是否参加活动
		userlogin.setIsAttendActivity(2);

		try {
			// 向用户登录表插入一条记录
			super.save(userlogin);
			return userlogin;
		} catch (Exception e) {
			log.error("添加用户出现异常！", e);
			return null;
		}
	}


	/**
	 * 
	 * @Title: isExistUserByUserName 
	 * @Description: 通过用户昵称判断（手机号）用户是否存在
	 * @param userName 用户名
	 * @return int 1: 存在用户，但是未参加活动 2: 存在用户，但是已经参加活动 3:用户不存在
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public int isExistUserByUserName(String userName) {

		UserLogin userLogin = getUserLoginByProperty("userName", userName);

		if (userLogin != null) {
			int isAttendActivity = userLogin.getIsAttendActivity();

			if (isAttendActivity == 1) { // 存在用户，但是未参加活动
				return 1;
			} else { // 存在用户，但是已经参加活动
				return 2;
			}
		} else {
			return 3;
		}

	}

	/**
	 * 
	 * @Title: bindingWeChatId 
	 * @Description: 将微信ID和手机号绑定
	 * @param weChatId 微信ID
	 * @param tellPhone 手机号
	 * @return boolean  true 成功 false 失败
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean bindingWeChatId(String tellPhone, String weChatId) {

		int excuteRow = 0;
		try {
			excuteRow = super.updateSqlRow(UserLoginSQL.BINDING_WECHATID_AND_TELLPHONE, weChatId, tellPhone);
		} catch (Exception e) {
			log.error("将微信ID和手机号绑定DAO出现异常！", e);
		}
		if (excuteRow != 0) {
			return true;
		}
		return false;
	}

	/**
	 * 
	 * @Title: updateisAttendActivity 
	 * @Description: 赠送给用户优惠券后将参加活动的用户状态改为已参加
	 * @param userId 用户ID
	 * @return boolean true 成功 false 失败
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean updateisAttendActivity(String userId) {

		int excuteRow = 0;
		try {
			excuteRow = super.updateSqlRow(UserLoginSQL.UPDATE_ISATTENDACtIVITY_STATUS, userId);
		} catch (Exception e) {
			log.error("更改用户参加活动状态出现异常！", e);
		}
		if (excuteRow != 0) {
			return true;
		}
		return false;

	}

	/**
	 * 
	 * 获取当前城市的所有用户的手机号
	 * 
	 * @Title: getAllUserTelPhoneByCity 
	 * @param String city 城市 (Not null)
	 * @return  List<String> 查询到的用户手机号集合
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public DubboInvokResponseDTO<List<String>> getAllUserTelPhoneByCity(String city) {

		List<Object[]> objects = null;

		try {
			objects = super.listSqlObj(UserLoginSQL.GET_USERTELPHONE_BY_CITY, city);
		} catch (Exception e) {
			log.error("获取当前城市的所有用户的手机号出息异常！", e);
		}

		// 返回的当前城市用户手机号集合
		List<String> telPhones = new ArrayList<String>();
		for (Object obj : objects) {
			if (obj != null) {
				telPhones.add(obj.toString());
			}
		}

		DubboInvokResponseDTO<List<String>> baseQueryResponseDTO = new DubboInvokResponseDTO<List<String>>();
		baseQueryResponseDTO.setResponseData(telPhones);
		return baseQueryResponseDTO;
	}

	/**
	 * 
	 * @Title: addCancelNumber 
	 * @Description: 给主动取消的用户增加一次取消订单次数
	 * @param userId 主动取消订单次数
	 * @author YHQ 
	 * @return void    返回类型
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addCancelNumber(String userId) {

		// 添加一个用户Id作为查询条件
		Criterion criterion = Restrictions.eq("uid", userId);

		try {
			// 根据用户Id获取登录信息
			UserLogin userLogin = super.queryCriteriaUnResult(criterion);

			// 判断如果登录信息不为空，则给该用户增加一次取消
			if (userLogin != null) {
				userLogin.setCancelNumber(userLogin.getCancelNumber() + 1);
			}

			return true;
		} catch (Exception e) {
			log.error("给用户增加取消次数时出现异常   类：" + this.getClass() + " addCancelNumber", e);
		}

		return false;
	}
	
	/**
	 * 
	 * @Title: addPushNumber 
	 * @Description: 减少一次用户优惠券数量
	 * @param userId 被推送用户Id
	 * @author YHQ 
	 * @return boolean    返回类型
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean reduceCouponNumber(String userId){
		
		try {
			// 减少一次用户优惠券数量
			int row = super.updateSqlRow(UserLoginSQL.REDUCE_COUPON_NUMBER, userId);
			
			if(row > 0){
				return true;
			}
			
		} catch (Exception e) {
			log.error("减少一次用户优惠券数量时出现异常  类："+this.getClass()+" reduceCouponNumber()", e);
		}
		return false;
	}
	
	/**
	 * 
	 * @Title: addPushNumber 
	 * @Description: 给用户增加一次推送订单次数
	 * @param userId 被推送用户Id
	 * @author YHQ 
	 * @return void    返回类型
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addPushNumber(String userId) {
		
		try {
			// 给用户增加一次推送订单次数
			int row = super.updateSqlRow(UserLoginSQL.INCREASE_PUSH_NUMBER, userId);
			
			if(row > 0){
				return true;
			}
			
		} catch (Exception e) {
			log.error("给用户增加一次推送订单次数时出现异常  类："+this.getClass()+" addPushNumber()", e);
		}
		return false;
	}

	/**
	 * 
	 * @Title: addCancelNumber 
	 * @Description:  确认到达，给双方增加完成订单次数
	 * @param driverId 司机Id
	 * @param passengerId 乘客Id
	 * @author YHQ 
	 * @return boolean    返回类型
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addConfirmArrival(String driverId, String passengerId, String ucId) {

		// 添加一个用户Id作为查询条件
		Criterion driverCriterion = Restrictions.eq("uid", driverId);
		Criterion passengerCriterion = Restrictions.eq("uid", passengerId);

		try {
			// 根据用户Id获取司机登录信息
			UserLogin driverUserLogin = super.queryCriteriaUnResult(driverCriterion);
			// 根据用户Id获取乘客登录信息
			UserLogin passengerUserLogin = super.queryCriteriaUnResult(passengerCriterion);

			// 判断如果登录信息不为空，则给该用户增加一次完成订单次数
			if (driverUserLogin != null) {
				driverUserLogin.setPublishNumber(driverUserLogin.getPublishNumber() + 1);
			}
			// 判断如果登录信息不为空，则给该用户增加一次完成订单次数
			if (passengerUserLogin != null) {
				passengerUserLogin.setPublishNumber(passengerUserLogin.getPublishNumber() + 1);
			}

			if (ToolUtil.isNotBlank(ucId)) {
				passengerUserLogin.setCouponNumber(passengerUserLogin.getCouponNumber() - 1);
			}

			return true;
		} catch (Exception e) {
			log.error("给用户增加取消次数时出现异常   类：" + this.getClass() + " addCancelNumber", e);
		}

		return false;
	}

}
